package org.gap.service;

import java.util.List;
import java.util.Set;

import org.gap.dao.CodesPostauxDAO;
import org.gap.dao.EtablissementsBancairesDAO;
import org.gap.dao.PaysDAO;

import org.gap.domain.CodesPostaux;
import org.gap.domain.EtablissementsBancaires;
import org.gap.domain.Pays;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

/**
 * Spring service that handles CRUD requests for Pays entities
 * 
 */

@Service("PaysService")
@Transactional
public class PaysServiceImpl implements PaysService {

	/**
	 * DAO injected by Spring that manages CodesPostaux entities
	 * 
	 */
	@Autowired
	private CodesPostauxDAO codesPostauxDAO;

	/**
	 * DAO injected by Spring that manages EtablissementsBancaires entities
	 * 
	 */
	@Autowired
	private EtablissementsBancairesDAO etablissementsBancairesDAO;

	/**
	 * DAO injected by Spring that manages Pays entities
	 * 
	 */
	@Autowired
	private PaysDAO paysDAO;

	/**
	 * Instantiates a new PaysServiceImpl.
	 *
	 */
	public PaysServiceImpl() {
	}

	/**
	 * Save an existing CodesPostaux entity
	 * 
	 */
	@Transactional
	public Pays savePaysCodesPostauxes(String pppPays, CodesPostaux related_codespostauxes) {
		Pays pays = paysDAO.findPaysByPrimaryKey(pppPays, -1, -1);
		CodesPostaux existingcodesPostauxes = codesPostauxDAO.findCodesPostauxByPrimaryKey(related_codespostauxes.getCdpPays(), related_codespostauxes.getCdpCodePostal(), related_codespostauxes.getCdpNInsee(), related_codespostauxes.getCdpLocalite());

		// copy into the existing record to preserve existing relationships
		if (existingcodesPostauxes != null) {
			existingcodesPostauxes.setCdpPays(related_codespostauxes.getCdpPays());
			existingcodesPostauxes.setCdpCodePostal(related_codespostauxes.getCdpCodePostal());
			existingcodesPostauxes.setCdpNInsee(related_codespostauxes.getCdpNInsee());
			existingcodesPostauxes.setCdpLocalite(related_codespostauxes.getCdpLocalite());
			existingcodesPostauxes.setCdpBureauDistributeur(related_codespostauxes.getCdpBureauDistributeur());
			existingcodesPostauxes.setCdpParticuCommuneLieuDit(related_codespostauxes.getCdpParticuCommuneLieuDit());
			existingcodesPostauxes.setCdpParticuBureauDistrib(related_codespostauxes.getCdpParticuBureauDistrib());
			existingcodesPostauxes.setCdpCodeMiseAJour(related_codespostauxes.getCdpCodeMiseAJour());
			existingcodesPostauxes.setCdpLocaliteFiscalStandard(related_codespostauxes.getCdpLocaliteFiscalStandard());
			related_codespostauxes = existingcodesPostauxes;
		}

		related_codespostauxes.setPays(pays);
		pays.getCodesPostauxes().add(related_codespostauxes);
		related_codespostauxes = codesPostauxDAO.store(related_codespostauxes);
		codesPostauxDAO.flush();

		pays = paysDAO.store(pays);
		paysDAO.flush();

		return pays;
	}

	/**
	 * Load an existing Pays entity
	 * 
	 */
	@Transactional
	public Set<Pays> loadPayss() {
		return paysDAO.findAllPayss();
	}

	/**
	 * Return a count of all Pays entity
	 * 
	 */
	@Transactional
	public Integer countPayss() {
		return ((Long) paysDAO.createQuerySingleResult("select count(o) from Pays o").getSingleResult()).intValue();
	}

	/**
	 * Return all Pays entity
	 * 
	 */
	@Transactional
	public List<Pays> findAllPayss(Integer startResult, Integer maxRows) {
		return new java.util.ArrayList<Pays>(paysDAO.findAllPayss(startResult, maxRows));
	}

	/**
	 * Save an existing Pays entity
	 * 
	 */
	@Transactional
	public void savePays(Pays pays) {
		Pays existingPays = paysDAO.findPaysByPrimaryKey(pays.getPppPays());

		if (existingPays != null) {
			if (existingPays != pays) {
				existingPays.setPppPays(pays.getPppPays());
				existingPays.setPppLibelle(pays.getPppLibelle());
				existingPays.setPppMasqueCodePostal(pays.getPppMasqueCodePostal());
				existingPays.setPppMasqueTelephone(pays.getPppMasqueTelephone());
				existingPays.setPppPrefixeInternational(pays.getPppPrefixeInternational());
				existingPays.setPppLibelleRecherche(pays.getPppLibelleRecherche());
				existingPays.setPppCpModifiable(pays.getPppCpModifiable());
				existingPays.setPppNInsee(pays.getPppNInsee());
				existingPays.setPppEtiquetteRib(pays.getPppEtiquetteRib());
				existingPays.setPppMasquePortable(pays.getPppMasquePortable());
				existingPays.setPppMasqueEtablissement(pays.getPppMasqueEtablissement());
				existingPays.setPppMasqueGuichet(pays.getPppMasqueGuichet());
				existingPays.setPppMasqueCompte(pays.getPppMasqueCompte());
				existingPays.setPppMasqueCle(pays.getPppMasqueCle());
				existingPays.setPppOrdreDsIban(pays.getPppOrdreDsIban());
				existingPays.setPppCe(pays.getPppCe());
			}
			pays = paysDAO.store(existingPays);
		} else {
			pays = paysDAO.store(pays);
		}
		paysDAO.flush();
	}

	/**
	 */
	@Transactional
	public Pays findPaysByPrimaryKey(String pppPays) {
		return paysDAO.findPaysByPrimaryKey(pppPays);
	}

	/**
	 * Delete an existing EtablissementsBancaires entity
	 * 
	 */
	@Transactional
	public Pays deletePaysEtablissementsBancaireses(String pays_pppPays, String related_etablissementsbancaireses_etbPays, Integer related_etablissementsbancaireses_etbEtablissement) {
		EtablissementsBancaires related_etablissementsbancaireses = etablissementsBancairesDAO.findEtablissementsBancairesByPrimaryKey(related_etablissementsbancaireses_etbPays, related_etablissementsbancaireses_etbEtablissement, -1, -1);

		Pays pays = paysDAO.findPaysByPrimaryKey(pays_pppPays, -1, -1);

		related_etablissementsbancaireses.setPays(null);
		pays.getEtablissementsBancaireses().remove(related_etablissementsbancaireses);

		etablissementsBancairesDAO.remove(related_etablissementsbancaireses);
		etablissementsBancairesDAO.flush();

		return pays;
	}

	/**
	 * Save an existing EtablissementsBancaires entity
	 * 
	 */
	@Transactional
	public Pays savePaysEtablissementsBancaireses(String pppPays, EtablissementsBancaires related_etablissementsbancaireses) {
		Pays pays = paysDAO.findPaysByPrimaryKey(pppPays, -1, -1);
		EtablissementsBancaires existingetablissementsBancaireses = etablissementsBancairesDAO.findEtablissementsBancairesByPrimaryKey(related_etablissementsbancaireses.getEtbPays(), related_etablissementsbancaireses.getEtbEtablissement());

		// copy into the existing record to preserve existing relationships
		if (existingetablissementsBancaireses != null) {
			existingetablissementsBancaireses.setEtbPays(related_etablissementsbancaireses.getEtbPays());
			existingetablissementsBancaireses.setEtbEtablissement(related_etablissementsbancaireses.getEtbEtablissement());
			existingetablissementsBancaireses.setEtbDescription(related_etablissementsbancaireses.getEtbDescription());
			existingetablissementsBancaireses.setEtbCodeSituation(related_etablissementsbancaireses.getEtbCodeSituation());
			existingetablissementsBancaireses.setEtbDateDebutValidite(related_etablissementsbancaireses.getEtbDateDebutValidite());
			existingetablissementsBancaireses.setEtbDateFinValidite(related_etablissementsbancaireses.getEtbDateFinValidite());
			existingetablissementsBancaireses.setEtbDateDisparition(related_etablissementsbancaireses.getEtbDateDisparition());
			existingetablissementsBancaireses.setEtbCodeEtablissNouveau(related_etablissementsbancaireses.getEtbCodeEtablissNouveau());
			existingetablissementsBancaireses.setEtbOptionIdInvariant(related_etablissementsbancaireses.getEtbOptionIdInvariant());
			existingetablissementsBancaireses.setEtbDateEffetIdInvariant(related_etablissementsbancaireses.getEtbDateEffetIdInvariant());
			related_etablissementsbancaireses = existingetablissementsBancaireses;
		}

		related_etablissementsbancaireses.setPays(pays);
		pays.getEtablissementsBancaireses().add(related_etablissementsbancaireses);
		related_etablissementsbancaireses = etablissementsBancairesDAO.store(related_etablissementsbancaireses);
		etablissementsBancairesDAO.flush();

		pays = paysDAO.store(pays);
		paysDAO.flush();

		return pays;
	}

	/**
	 * Delete an existing CodesPostaux entity
	 * 
	 */
	@Transactional
	public Pays deletePaysCodesPostauxes(String pays_pppPays, String related_codespostauxes_cdpPays, String related_codespostauxes_cdpCodePostal, String related_codespostauxes_cdpNInsee, String related_codespostauxes_cdpLocalite) {
		CodesPostaux related_codespostauxes = codesPostauxDAO.findCodesPostauxByPrimaryKey(related_codespostauxes_cdpPays, related_codespostauxes_cdpCodePostal, related_codespostauxes_cdpNInsee, related_codespostauxes_cdpLocalite, -1, -1);

		Pays pays = paysDAO.findPaysByPrimaryKey(pays_pppPays, -1, -1);

		related_codespostauxes.setPays(null);
		pays.getCodesPostauxes().remove(related_codespostauxes);

		codesPostauxDAO.remove(related_codespostauxes);
		codesPostauxDAO.flush();

		return pays;
	}

	/**
	 * Delete an existing Pays entity
	 * 
	 */
	@Transactional
	public void deletePays(Pays pays) {
		paysDAO.remove(pays);
		paysDAO.flush();
	}
}
